package ch05
{
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.ActivityEvent;
	import flash.events.StatusEvent;
	import flash.media.Microphone;

	/**
	 * 声控开关游戏，开灯、关灯.
	 * 注意调用了一个叫setSilenceLevel 的函数，它用来设置之前提
	   到的声音跃过的某个值。默认是10，这里设置的是25。
	   setSilenceLevel 的第二个参数是时间跨度，单位毫秒。当一个ActivityEvent 被发布，
	   麦克风会忽略这个时间跨度内其它的 ActivityEvent。比如连续拍三下手，每次拍手活跃
	   级数都会上下波动一次，而设置了时间跨度，跨度内的拍手就会被忽略。默认是 2000 也
	   就是 2 秒，对于聊天程序这可能是个不错的选择。在此，我发现有点偏长，就设置成了
	   500。onActivity 是处理函数，这里，它只关心有声音发出，而不关心声音消失。当有声
	   音发出，切换变量_on，并调用update 函数。update 函数根据_on 来绘制场景黑白。
	   运行下试试吧。我建议对setSilenceLevel 尝试设置不同的参数看看效果。如果想知道当
	   前的设置情况，Microphone 类还有两个只读属 性：silenceLevel 和silenceTimeout。
	 */
	public class Clapper extends Sprite
	{
		private var _mic:Microphone;
		private var _on:Boolean = false;

		public function Clapper()
		{
			stage.align = StageAlign.TOP_LEFT;
			stage.scaleMode = StageScaleMode.NO_SCALE;

			update();

			_mic = Microphone.getMicrophone();
			_mic.setSilenceLevel(25, 500);
			_mic.setLoopBack(true);
			_mic.addEventListener(ActivityEvent.ACTIVITY, onActivity);
			_mic.addEventListener(StatusEvent.STATUS, onStatus);
		}

		private function onStatus(e:StatusEvent):void
		{
			trace("onStatus:", e.code, e.level);
		}

		private function onActivity(event:ActivityEvent):void
		{
			if (event.activating)
			{
				_on = !_on;
				update();
			}
		}

		private function update():void
		{
			graphics.clear();
			if (_on)
			{
				graphics.beginFill(0xffffff);
			}
			else
			{
				graphics.beginFill(0);
			}
			graphics.drawRect(0, 0, stage.stageWidth, stage.stageHeight);
		}
	}
}
